#pragma once
#include "Epoll.h"
#include "InetAddress.h"
#include "Sock.h"
#include <functional>
class Epoll;

class Channel
{
public:
    using func_t = std::function<void()>;
public:
    Channel(Epoll *ep, int fd);
    ~Channel();

    int getFd();
    void useET();
    void enableReading();
    void setInEpoll();
    void setRevents(uint32_t ev);
    bool inpoll();
    uint32_t getEvent();
    uint32_t getRevent();

    // c处理事情
    void handleevent();
    // std::vector<Channel*> loop(int timeout=-1);

    void newconnection(Sock *servsock); // 处理新客户端连接请求。
    void onmessage();                     // 处理对端发送过来的消息。

    void setReadCallBack(func_t fn);

private:
    int fd_; // Channel拥有的fd，Channel和fd是一对一的关系。
    Epoll *epfd_;      // Channel对应的红黑树，Channel与Epoll是多对一的关系，一个Channel只对应一个Epoll。
    bool inepoll_;     // Channel是否已添加到epoll树上，如果未添加，调用epoll_ctl()的时候用EPOLL_CTL_ADD，否则用EPOLL_CTL_MOD。
    uint32_t events_;  // fd_需要监视的事件。listenfd和clientfd需要监视EPOLLIN，clientfd还可能需要监视EPOLLOUT。
    uint32_t revents_; // fd_已发生的事件。
    func_t readCallBack_;
};